home *** CD-ROM | disk | FTP | other *** search
/ CD ROM Paradise Collection 4 / CD ROM Paradise Collection 4 1995 Nov.iso / program / recio212.zip / rcbput.c < prev    next >
C/C++ Source or Header  |  1995-01-29  |  4KB  |  113 lines

  1. /*****************************************************************************
  2.    MODULE: rcbput.c
  3.   PURPOSE: recio column delimited integral number output functions
  4. COPYRIGHT: (C) 1994-1995, William Pierpoint
  5.  COMPILER: Borland C Version 3.1
  6.        OS: MSDOS Version 6.2
  7.   VERSION: 2.12
  8.   RELEASE: January 29, 1995
  9. *****************************************************************************/
  10.  
  11. #include <stdio.h>
  12. #include <stdlib.h>
  13. #include <string.h>
  14.  
  15. #include "recio.h"
  16.  
  17. extern int _risready(REC *rp, int mode);
  18. extern int _rputc(REC *rp, int ch);
  19.  
  20. #define rfp(rp)          ((rp)->r_fp)
  21. #define rcol(rp)         ((rp)->r_colno)
  22. #define rfldch(rp)       ((rp)->r_fldch)
  23. #define rflags(rp)       ((rp)->r_flags)
  24.  
  25. #define uint             unsigned int
  26. #define ulong            unsigned long
  27. #define UNSIGNED         0
  28. #define SIGNED           1
  29.  
  30. /****************************************************************************/
  31. static void                  /* return nothing                              */
  32.     _rcbputl(                /* put integral number to col delim rec stream */
  33.         REC   *rp,           /* pointer to record stream                    */
  34.         size_t begcol,       /* field inclusive beginning column            */
  35.         size_t endcol,       /* field inclusive ending column               */
  36.         int    base,         /* base (radix) (2 to 36)                      */
  37.         int    sign,         /* signed number?                              */
  38.         long   num)          /* number to put to stream                     */
  39. /****************************************************************************/
  40. {
  41.     size_t sl;               /* length of _r_nsbuf */
  42.  
  43.     if (_risready(rp, R_WRITE)) { 
  44.         if (endcol>=begcol && begcol>=rcolno(rp) && base>=2 && base<=36) {
  45.             rfldno(rp)++;
  46.             rflags(rp) &= ~_R_TXT;
  47.  
  48.             /* if colno < begcol, pad with spaces */
  49.             while (rcolno(rp) < begcol) {
  50.                 if (_rputc(rp, ' ')) goto done;
  51.             }
  52.  
  53.             /* based on sign, select conversion function */
  54.             if (sign) {
  55.                 ltoa(num, _r_nsbuf, base);
  56.             } else {
  57.                 ultoa((ulong)num, _r_nsbuf, base);
  58.             }
  59.  
  60.             /* if converted string fits space */
  61.             sl = strlen(_r_nsbuf); 
  62.             if (sl <= (endcol-begcol+1)) { 
  63.  
  64.                 /* right justify string */
  65.                 while (rcolno(rp) <= endcol-sl) { 
  66.                     if (_rputc(rp, ' ')) goto done; 
  67.                 }
  68.                 
  69.                 /* output converted string */
  70.                 if (fputs(_r_nsbuf, rfp(rp))==EOF) { 
  71.                     rseterr(rp, R_ENOPUT); 
  72.                 } else { 
  73.                     rcol(rp) += sl; 
  74.                 } 
  75.  
  76.             /* else converted string too long for space */
  77.             } else { 
  78.                 rsetwarn(rp, R_WWIDTH); 
  79.                 while (rcolno(rp) <= endcol) { 
  80.                     if (_rputc(rp, '*')) goto done;
  81.                 } 
  82.             } 
  83.  
  84.         } else { 
  85.             rseterr(rp, R_EINVAL); 
  86.         } 
  87.     } 
  88. done: 
  89. }
  90.  
  91. /****************************************************************************/
  92. /* column delimited integral number output functions                        */
  93. /****************************************************************************/
  94. void rcbputi(REC *rp, size_t begcol, size_t endcol, int base, int num)
  95. {
  96.     _rcbputl(rp, begcol, endcol, base, SIGNED, (long) num);
  97. }
  98.  
  99. void rcbputui(REC *rp, size_t begcol, size_t endcol, int base, uint num)
  100. {
  101.     _rcbputl(rp, begcol, endcol, base, UNSIGNED, (long) num);
  102. }
  103.  
  104. void rcbputl(REC *rp, size_t begcol, size_t endcol, int base, long num)
  105. {
  106.     _rcbputl(rp, begcol, endcol, base, SIGNED, num);
  107. }
  108.  
  109. void rcbputul(REC *rp, size_t begcol, size_t endcol, int base, ulong num)
  110. {
  111.     _rcbputl(rp, begcol, endcol, base, UNSIGNED, (long) num);
  112. }
  113.